'use strict';

const Controller = require('egg').Controller;

class ShareController extends Controller {
    // 创建分享
   async create(){
    //    结构
    let {app,ctx}=this
    let user_id=ctx.authUser.id
    // 参数验证
    ctx.validate({
        file_id:{
            type:'int',
            required:true,
            desc:'文件id'
        }
    })
    let {file_id}=ctx.request.body
    // 文件 文件夹是否存在
    let f=await app.model.File.findOne({
        where:{
            id:file_id,
            user_id
        }
    })
    if(!f){
        return ctx.throw(400,'文件不存在')
    }
    // 创建唯一id
    let sharedurl=ctx.genID(15)
    // 创建分享
    let s=await app.model.Share.create({
        sharedurl,
        file_id,
        iscancel:0,
        user_id
    })
    // 返回数据
    let url = 'http://127.0.0.1:7001/share/'+sharedurl
    ctx.apiSuccess('分享链接：'+url)
   }
    // 我的分享列表
  async list() {
    // 结构
    let {app,ctx}=this
    let user_id=ctx.authUser.id
    // 查询 管理文件模型
    let list= await app.model.Share.findAll({
        where:{
            user_id
        },
        include:[{
            model:app.model.File
        }]
    })
    // 返回数据
    ctx.apiSuccess(list)
  }
//   查看分享
async read(){
    // 结构
    const { ctx,app,service } = this;
    // 参数验证
    let sharedurl = ctx.params.sharedurl
    if(!sharedurl){
        return ctx.apiFail('非法参数');
    }

    let file_id =  ctx.query.file_id

    // 分享是否存在
    let s = await service.share.isExist(sharedurl)
    // 组织查询条件
    let where = {
        user_id:s.user_id,
    }

    if(!file_id){
        where.id = s.file_id
    } else {
        where.file_id = file_id
    }

    let rows = await app.model.File.findAll({
        where,
        order: [
            ['isdir', 'desc']
        ]
    });

    ctx.apiSuccess(rows)
}
// 保存到自己的网盘
async saveToSelf(){
        // 结构
        const {ctx,app,service}=this
        let current_user_id=ctx.authUser.id
        // 参数验证
        ctx.validate({
            dir_id:{
                type:'int',
                required:true,
                desc:'目录ID'
            },
            sharedurl:{
                type:'string',
                required:true,
                desc:'分享标识'
            }
        })
        let {dir_id,sharedurl}=ctx.request.body
        // 判断分享是否存在
        let s=await service.share.isExist(sharedurl,{include:[{model:app.model.File}]})
        // 判断是否为自己的分享
        if(s.user_id===current_user_id){
            return ctx.apiSuccess('本人分享，无需保存')
        }
        //如果dir_id 大于0 判断文件夹是否存在
        if(dir_id>0){
            await service.file.isDirExist(dir_id)
        } 
        // 查看该分享目录下的所有文件
        let getAllFile=async (obj,dirId)=>{
            let data = {
                name: obj.name,
                ext: obj.ext,
                md: obj.md,
                file_id:dirId,
                user_id: current_user_id,
                size: obj.size,
                isdir: obj.isdir,
                url: obj.url,
            }
             // 判断当前用户剩余空间
             if(ctx.authUser.total_size-ctx.authUser.used<obj.size){
              return  ctx.throw(400,'你的可用空间不足')
             }
            //  直接创建
            let o=await app.model.Share.create(data)
            // 更新user表的使用内存
            ctx.authUser.used_size=ctx.authUser.used_size+parseInt(data.size)
            await ctx.authUser.save()
            //  如果是目录 查询目录下的所有文件
            if(obj.isdir){
                let rows=await app.model.File.findAll({
                    where:{
                        user_id:obj.user_id,
                        file_id:obj.id
                    }
                })
                rows.forEach(item=>{
                    getAllFile(item,o.id)
                })
                return
            }
            await getAllFile(s.file,dir_id)
            ctx.apiSuccess('ok')

        }
}
}

module.exports = ShareController;
